﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Chilis.Marketing.Common;
using System.Data.SqlClient;
using System.Data;
using Chilis.Marketing.Business.Entity;

namespace Chilis.Marketing.Data.Access
{
    public class DACargo : ConexionBD
    {
        #region ATRIBUTOS

        private SqlCommand cmd;

        #endregion

        #region CONSTRUCTOR
        #endregion

        #region PROPIEDADES
        #endregion

        #region METODOS

        /// <summary>
        /// Método              : insertarCargo
        /// Descripción         : Inserta Cargo en la BD
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="cargoBE">Entidad que representa el Cargo</param>
        /// <param name="transaccionIniciada">Indicador de Transaccion Iniciada</param>
        /// <returns>Retorna el Id del Cargo insertado</returns>
        public int insertarCargo(BECargo cargoBE,
                                 bool transaccionIniciada)
        {
            int codInsertado = 0;
            if (!transaccionIniciada)
            {
                this.Conexion();
                this.AbrirConexion();
            }
            cmd = new SqlCommand();
            cmd.Connection = this.connection;
            cmd.Transaction = this.miTransaccion;
            cmd.CommandText = "spInsertaCargo";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add("@pIdCargo", SqlDbType.Int).Direction = ParameterDirection.Output;
            cmd.Parameters.Add(new SqlParameter("@pDescripcion", cargoBE.Descripcion));
            cmd.Parameters.Add(new SqlParameter("@pEstado", cargoBE.Estado.ToString("D")));
            cmd.Parameters.Add(new SqlParameter("@pUsuario", cargoBE.Usuario));

            try
            {
                cmd.ExecuteNonQuery();
                codInsertado = (int)cmd.Parameters["@pIdCargo"].Value;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                if (!transaccionIniciada)
                {
                    this.CerrarConexion();
                }
            }
            return codInsertado;
        }


        /// <summary>
        /// Método              : modificarCargo
        /// Descripción         : Modifica Cargo en la BD
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="cargoBE">Entidad que representa el Cargo</param>
        /// <param name="transaccionIniciada">Indicador de Transacción Iniciada</param>
        /// <returns>Retorna un booleano que indica si se actualizo el registro</returns>
        public bool modificarCargo(BECargo cargoBE,
                                   bool transaccionIniciada)
        {
            bool respuesta = true;

            //int codInsertado = 0;
            if (!transaccionIniciada)
            {
                this.Conexion();
                this.AbrirConexion();
            }
            cmd = new SqlCommand();
            cmd.Connection = this.connection;
            cmd.Transaction = this.miTransaccion;
            cmd.CommandText = "spModificaCargo";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add(new SqlParameter("@pIdCargo", cargoBE.IdCargo));
            cmd.Parameters.Add(new SqlParameter("@pDescripcion", cargoBE.Descripcion));
            cmd.Parameters.Add(new SqlParameter("@pEstado", cargoBE.Estado.ToString("D")));
            cmd.Parameters.Add(new SqlParameter("@pUsuario", cargoBE.Usuario));

            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                respuesta = false;
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                if (!transaccionIniciada)
                {
                    this.CerrarConexion();
                }
            }
            return respuesta;
        }


        /// <summary>
        /// Método              : obtenerCargoPorId
        /// Descripción         : Obtiene la Entidad Cargo
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="idCargo">Id Cargo</param>
        /// <returns>Retorna el Objeto que representa la Entidad Cargo</returns>
        public BECargo obtenerCargoPorId(int idCargo)
        {
            DataSet ds = null;
            BECargo cargoBE = null;
            this.Conexion();

            cmd = new SqlCommand();
            cmd.Connection = this.connection;
            this.AbrirConexion();

            cmd.CommandText = "spSelCargoPorId";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();
            cmd.Parameters.Add(new SqlParameter("@pIdCargo", idCargo));

            try
            {
                cmd.ExecuteNonQuery();

                ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);

                if (ds != null)
                {
                    cargoBE = this.poblarCargo(ds.Tables[(int)Constantes.CARGO_DATOS.DATOS_GENERALES], cargoBE);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                this.CerrarConexion();
            }
            return cargoBE;
        }

        /// <summary>
        /// Método              : poblarCargo
        /// Descripción         : Se encarga de poblar los datos obtenidos en la Entidad Cargo
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="dtCargo">Resultado de la Búsqueda por Id</param>
        /// <param name="cargoBE">Entidad que repreenta el Cargo</param>
        /// <returns>Retorna el Objeto que representa la Entidad Cargo</returns>
        private BECargo poblarCargo(DataTable dtCargo, BECargo cargoBE)
        {
            if (dtCargo != null && dtCargo.Rows.Count > 0)
            {
                if (cargoBE == null)
                {
                    cargoBE = new BECargo();
                }

                DataRow drCargo = dtCargo.Rows[0];
                if (drCargo["id_cargo"] != DBNull.Value)
                {
                    int tempIdCargo = 0;
                    int.TryParse(drCargo["id_cargo"].ToString(), out tempIdCargo);
                    cargoBE.IdCargo = tempIdCargo;
                }
                if (drCargo["descripcion"] != DBNull.Value)
                {
                    cargoBE.Descripcion = drCargo["descripcion"].ToString();
                }
                if (drCargo["estado"] != DBNull.Value)
                {
                    cargoBE.Estado = Common.Constantes.ObtenerEnumEstado(drCargo["estado"].ToString());
                }
            }
            return cargoBE;
        }


        /// <summary>
        /// Función             : buscarCargos
        /// Descripción         : Busca los Cargos de acuerdo a los filtros configurados
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="filtro">Entidad que representa el Cargo</param>
        /// <returns>Listado de Cargos de acuerdo al filtro especificado</returns>
        public DataTable buscarCargos(BECargo filtro)
        {
            DataTable dt = new DataTable();
            SqlDataAdapter da = null;
            this.Conexion();
            cmd = new SqlCommand();
            cmd.Connection = this.connection;

            this.AbrirConexion();

            cmd.CommandText = "spListarCargo";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add(new SqlParameter("@pIdCargo", filtro.IdCargo));
            cmd.Parameters.Add(new SqlParameter("@pDescripcion", filtro.Descripcion));
            cmd.Parameters.Add(new SqlParameter("@pEstado", filtro.Estado.ToString("D")));
            cmd.Parameters.Add(new SqlParameter("@pOrderBy", filtro));
            cmd.Parameters.Add(new SqlParameter("@pDeForma", filtro.De_forma));

            try
            {
                da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            catch (Exception ex)
            {
                dt = null;
                throw ex;
            }
            finally
            {
                if (da != null)
                {
                    da.Dispose();
                }
                cmd.Dispose();
                this.CerrarConexion();
            }
            return dt;

        }


        #endregion
    }
}
